home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / demo / mag / Infamia3.lha / infamia03 / mv_code / copper / mask1.s next >
Text File  |  1996-07-24  |  11KB  |  288 lines

  1.         ************************************
  2.         *       /\/\                       *
  3.         *      /    \                      *
  4.         *     / /\/\ \ O R B_I D           *
  5.         *    / /    \ \   / /              *
  6.         *   / /    __\ \ / /               *
  7.         *   ¯¯     \ \¯¯/ / I S I O N S    *
  8.         *           \ \/ /                 *
  9.         *            \  /                  *
  10.         *             \/                   *
  11.         *     Feel the DEATH inside!       *
  12.         ************************************
  13.         * Coded by:                        *
  14.         * The Dark Coder / Morbid Visions  *
  15.         ************************************
  16.  
  17. * ATTENZIONE:
  18. ; Questo sorgente e` basato sulla Lezione11h4.s del Corso di Randy
  19. ; Mostra come effettuare il mascheramento anche per posizioni verticali
  20. ; maggiori di $80. Commenti alla fine del sorgente
  21. ; I credits per il sorgente originale sono di Randy - RJ
  22. ; Ehi Randy spero che non te la prendi se miglioro il tuo lavoro!
  23. ; Friendship RULEZ! :)))) (The Dark Coder)
  24.  
  25.     SECTION    DK,code
  26.     incdir    "Infamia:MV_code/"
  27.     include    MVstartup.s        ; Codice di startup: prende il
  28.                     ; controllo del sistema e chiama
  29.                     ; la routine START: ponendo
  30.                     ; A5=$DFF000
  31.  
  32.         ;5432109876543210
  33. DMASET    EQU    %1000001010000000    ; solo copper DMA
  34.  
  35. START:
  36.     lea    $dff000,a5
  37.     move    #DMASET,dmacon(a5)    ; DMACON - abilita bitplane, copper
  38.                     ; e sprites.
  39.  
  40.     move.l    #COPPERLIST,cop1lc(a5)    ; Puntiamo la nostra COP
  41.     move    d0,copjmp1(a5)        ; Facciamo partire la COP
  42.  
  43. mouse:
  44.  
  45. ; notare il doppio controllo sulla sincronia
  46. ; necessario perche` la muovicopper richiede MENO di UNA rasterline su 68030
  47.     move.l    #$1ff00,d1    ; bit per la selezione tramite AND
  48.     move.l    #$13000,d2    ; linea da aspettare = $130, ossia 304
  49. .Waity1
  50.     move.l    vposr(a5),d0    ; vposr e vhposr
  51.     and.l    d1,d0        ; seleziona solo i bit della pos. verticale
  52.     cmp.l    d2,d0        ; aspetta la linea $130 (304)
  53.     bne.s    .waity1
  54.  
  55. .Waity2
  56.     move.l    vposr(a5),d0
  57.     and.l    d1,d0
  58.     cmp.l    d2,d0
  59.     beq.s    .waity2
  60.  
  61.     btst    #2,potinp(a5)    ; tasto destro premuto?
  62.     beq.s    .noMuovi    ; se si non eseguire MuoviCopper
  63.     bsr.s    MuoviCopper    ; Routine che sfrutta il mascheramento del WAIT
  64. .noMuovi
  65.  
  66.     btst    #6,$bfe001    ; mouse premuto?
  67.     bne.s    mouse
  68.     rts
  69.  
  70. *****************************************************************************
  71.  
  72. MuoviCopper:
  73.     tst.b    SuGiu        ; Dobbiamo salire o scendere? se SuGiu e'
  74.                 ; azzerata, (cioe' il TST verifica il BEQ)
  75.                 ; allora saltiamo a VAIGIU, se invece e' a $FF
  76.                 ; (se cioe' questo TST non e' verificato)
  77.                 ; continuiamo salendo (facendo dei subq)
  78.     beq.w    VAIGIU
  79.     cmp.b    #$80,BARRA    ; siamo arrivati alla linea $80?
  80.     sne    SuGiu        ; se si, siamo in cima e dobbiamo scendere
  81.                 ; Nel codice di randy c'era una Beq che saltava
  82.                 ; ad un pezzo di codice che azzerava il flag.
  83.                 ; Usando la Scc si va piu` veloci e si
  84.                 ; risparmia memoria. E` consigliabile usare
  85.                 ; sempre la Scc per alterare i flag
  86.     subq.b    #1,BARRA
  87.     rts
  88.  
  89. VAIGIU:
  90.     cmp.b    #$F0,BARRA    ; siamo arrivati alla linea $F0?
  91.     seq    SuGiu        ; se si, siamo in fondo e dobbiamo risalire
  92.                 ; Anche qui abbiamo sostituito la BEQ di
  93.                 ; Randy con una SEQ
  94.     addq.b    #1,BARRA
  95.     rts
  96.  
  97. SuGiu:    dc.b    0    ; flag direzione
  98.  
  99.  
  100. *****************************************************************************
  101.  
  102.     SECTION    GRAPHIC,DATA_C
  103.  
  104. COPPERLIST:
  105.     dc.w    $100,$200
  106.     dc.w    $180,$000    ; Inizio la cop col colore NERO
  107.  
  108.     dc.w    $2c07,$FFFE    ; una piccola barretta fissa verde
  109.     dc.w    $180,$010
  110.     dc.w    $2d07,$FFFE
  111.     dc.w    $180,$020
  112.     dc.w    $2e07,$FFFE
  113.     dc.w    $180,$030
  114.     dc.w    $2f07,$FFFE
  115.     dc.w    $180,$040
  116.     dc.w    $3007,$FFFE
  117.     dc.w    $180,$030
  118.     dc.w    $3107,$FFFE
  119.     dc.w    $180,$020
  120.     dc.w    $3207,$FFFE
  121.     dc.w    $180,$010
  122.     dc.w    $3307,$FFFE
  123.     dc.w    $180,$000
  124.  
  125.  
  126. BARRA:
  127.     dc.w    $8407,$FFFE    ; aspetto la linea $79 (WAIT NORMALE!)
  128.                 ; questo wait e' il "BOSS" dei wait
  129.                 ; mascherati seguenti, infatti lo seguono
  130.                 ; come degli scagnozzi: se questo wait
  131.                 ; scende di 1, tutti i wait mascherati
  132.                 ; sottostanti scendono di 1, eccetera.
  133.  
  134.     dc.w    $180,$300    ; inizio la barra rossa: rosso a 3
  135.  
  136.     dc.w    $80E1,$80FE    ; Questa WAIT attende la fine di una riga.
  137.                 ; Si tratta di una WAIT con posizione
  138.                 ; verticale mascherata. Poiche` questa
  139.                 ; istruzione va eseguita DOPO la riga
  140.                 ; $80, il bit alto (non mascherabile)
  141.                 ; deve essere settato a 1.
  142.  
  143.     dc.w    $0001,$FFFE    ; questa WAIT e` un istruzione "inutile"
  144.                 ; infatti non blocca mai il copper.
  145.                 ; Il suo scopo e` quello di far perdere
  146.                 ; un po' di tempo al copper in maniera che
  147.                 ; la seguente CMOVE venga eseguita quando
  148.                 ; il pennello elettronico ha iniziato la
  149.                 ; riga seguente.
  150.  
  151.     dc.w    $180,$600    ; rosso a 6
  152.  
  153.     dc.w    $80E1,$80FE    ; aspetta fine riga
  154.     dc.w    $0001,$FFFE    ; WAIT inutile che rallenta il copper
  155.  
  156.     dc.w    $180,$900    ; rosso a 9
  157.  
  158.     dc.w    $80E1,$80FE    ; aspetta fine riga
  159.     dc.w    $0001,$FFFE    ; WAIT inutile che rallenta il copper
  160.  
  161.     dc.w    $180,$c00    ; rosso a 12
  162.  
  163.     dc.w    $80E1,$80FE    ; aspetta fine riga
  164.     dc.w    $0001,$FFFE    ; WAIT inutile che rallenta il copper
  165.  
  166.     dc.w    $180,$f00    ; rosso a 15 (al massimo)
  167.  
  168.     dc.w    $80E1,$80FE    ; aspetta fine riga
  169.     dc.w    $0001,$FFFE    ; WAIT inutile che rallenta il copper
  170.  
  171.     dc.w    $180,$c00    ; rosso a 12
  172.  
  173.     dc.w    $80E1,$80FE    ; aspetta fine riga
  174.     dc.w    $0001,$FFFE    ; WAIT inutile che rallenta il copper
  175.  
  176.     dc.w    $180,$900    ; rosso a 9
  177.  
  178.     dc.w    $80E1,$80FE    ; aspetta fine riga
  179.     dc.w    $0001,$FFFE    ; WAIT inutile che rallenta il copper
  180.  
  181.     dc.w    $180,$600    ; rosso a 6
  182.  
  183.     dc.w    $80E1,$80FE    ; aspetta fine riga
  184.     dc.w    $0001,$FFFE    ; WAIT inutile che rallenta il copper
  185.  
  186.     dc.w    $180,$300    ; rosso a 3
  187.  
  188. UltimaFineRiga:
  189.     dc.w    $80E1,$80FE    ; aspetta fine riga
  190.     dc.w    $0001,$FFFE    ; WAIT inutile che rallenta il copper
  191.  
  192.     dc.w    $180,$000    ; colore NERO
  193.  
  194.     dc.w    $fd07,$FFFE    ; aspetto la linea $FD
  195.     dc.w    $180,$00a    ; blu intensita' 10
  196.     dc.w    $fe07,$FFFE    ; linea seguente
  197.     dc.w    $180,$00f    ; blu intensita' massima (15)
  198.  
  199.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  200.  
  201.     end
  202.  
  203. Nel corso di Randy nella lezione11h4.s viene mostrato come realizzare una
  204. barretta con il copper mediante delle WAIT con posizione verticale mascherata,
  205. tecnica che permette di velocizzare l'aggiornamento della copperlist rispetto
  206. al caso in cui vengono usate WAIT con posizioni verticali NON mascherate.
  207.  
  208. Nel sorgente viene anche asserita l'impossibilita` di adottare questa tecnica
  209. nelle posizioni verticali comprese tra $80 e $FF. Citiamo direttamente dal
  210. commento della lezione11h4.s:
  211.  
  212. "Quindi, si puo' dire che il mascheramento funziona nella parte alta dello
  213. schermo da $00 a $7f circa, e sotto la zona NTSC, ossia dopo il $FFDF,$FFFE."
  214.  
  215. Ebbene questo e` falso!!!
  216. Come spieghiamo anche nell'articolo "More Advanced Copper" su questo
  217. numero di Infamia, e` possibilissimo usare il mascheramento nelle posizioni
  218. comprese tra $80 e $FF con un semplicissimo accorgimento. Il problema, infatti
  219. nasce dal fatto che il bit piu` alto della posizione verticale del copper
  220. non e` mascherabile, e quindi viene usato dal copper per il confronto della
  221. posizione specificata nella WAIT (o nella SKIP) e la posizione del pennello
  222. elettronico.
  223. Randy nel sorgente lezione11h4.s del suo corso utilizza delle WAIT con i 7 bit
  224. bassi della posizione verticale mascherati per attendere la fine di una riga.
  225. Le WAIT che Randy utilizza sono delle DC.W $00E1,$80FE, che hanno il bit 8
  226. della posizione verticale da attendere (cioe` il bit 15 della prima WORD)
  227. settato a 0. Se una tale WAIT viene eseguita quando il pennello elettronico si
  228. trova ad una posizione verticale con il bit 8 settato a 0 (cioe` minore di $80
  229. o maggiore di $FF), essendo i bit 8 di valore uguale e poiche` gli altri bit
  230. della posizione verticale sono disabilitati, si tiene conto della posizione
  231. orizzontale, e pertanto la WAIT attende la fine della riga come voluto.
  232. Se invece una tale WAIT viene eseguita quando il pennello elettronico si
  233. trova ad una posizione verticale con il bit 8 settato a 1 (cioe` maggiore o
  234. uguale ad $80 e minore o uguale a $FF), essendo il bit 8 della pos. verticale
  235. del pennello elettronico maggiore del bit 8 della posizione specificata nella
  236. WAIT, il copper considera la posizione specificata dalla WAIT minore di quella
  237. del pennello elettronico e NON aspetta la fine della riga.
  238. Come si fa allora ad aspettare la fine di una riga la cui pos. verticale ha il
  239. bit 8 settato a 1? E` molto semplice, mediante una WAIT cosi` composta:
  240.  
  241.   DC.W $80E1,$80FE
  242.  
  243. Questa WAIT si differenzia da q